package main

import "fmt"

// 定义一个接口
// 接口是一组方法的签名
type sounder interface {
	MakeSound()
}

// 只要方法中含有接口中规定的方法即可接口（隐式实现）
type Dog struct{}

func (d Dog) MakeSound() {
	fmt.Println("汪汪")
}

type Cat struct{}

func (c Cat) MakeSound() {
	fmt.Println("喵喵")
}

// 通过这个方法来实现统一的调用
// 传递一个动物，实现了接口的动物，就可以发出声音
func Greet(a sounder) {
	a.MakeSound()
}
func main() {
	// 如果实现了接口，结构体变量类型可以指定为接口类型
	var d1 sounder = Dog{}
	// fmt.Println(d1)
	Greet(d1)
	var c1 sounder = Cat{}
	// fmt.Println(c1)
	Greet(c1)

}
